home *** CD-ROM | disk | FTP | other *** search
/ Aminet 49 / Aminet 49 (2002)(GTI - Schatztruhe)[!][Jun 2002].iso / Aminet / util / misc / ReportPlus.lha / ReportPlus / source / f9.c < prev    next >
C/C++ Source or Header  |  2002-04-15  |  15KB  |  452 lines

  1. #include <exec/types.h>
  2. #include <proto/exec.h>
  3. #include <intuition/intuition.h>
  4. #include <intuition/gadgetclass.h>
  5. #include <proto/intuition.h>
  6. #include <libraries/gadtools.h>
  7. #include <proto/gadtools.h>
  8. #include <libraries/resource.h>
  9. #include <proto/resource.h>
  10. #include <resources/battmem.h>
  11. #include <resources/battmembitsamiga.h>
  12. #include <resources/battmembitsshared.h>
  13. #include <proto/battmem.h>
  14. #include <graphics/gfx.h>
  15. #include <clib/graphics_protos.h>
  16. #include <dos/dos.h>
  17. #include <clib/dos_protos.h>
  18.  
  19. #include <ctype.h>
  20. #include <stdlib.h>
  21. #include "rp.h"
  22.  
  23. #define BOXLEFTX   48
  24. #define BOXRIGHTX  (BOXLEFTX + 10 + (32 * 8))
  25. #define BOXTOPY    24
  26. #define BOXBOTTOMY (BOXTOPY  +  6 + ( 3 * 8))
  27.  
  28. MODULE struct Gadget  *BU91_Revert         = NULL,
  29.                       *BU91_Write          = NULL,
  30.                       *CB91_SharedAmnesia  = NULL,
  31.                       *IN91_SCSIHostID     = NULL,
  32.                       *CB91_SCSISyncXfer   = NULL,
  33.                       *CB91_SCSIFastSync   = NULL,
  34.                       *CB91_SCSITagQueues  = NULL,
  35.                       *CB91_AmigaAmnesia   = NULL,
  36.                       *CB91_SCSITimeout    = NULL,
  37.                       *CB91_SCSILUNS       = NULL;
  38. MODULE UBYTE          IOBuffer[LONGESTFIELD + 1];
  39. IMPORT ABOOL          BattBuffer[96];
  40.  
  41. AGLOBAL struct Library*    BattMemBase     = NULL;
  42.  
  43. // from rp.c
  44. IMPORT ABOOL               fillwindows;
  45. IMPORT SBYTE               page;
  46. IMPORT struct NewGadget    Gadget;
  47. IMPORT struct Gadget      *BU99_Right,
  48.                           *ST99_Output,
  49.                           *BU99_OutputASL,
  50.                           *PrevGadPtr;
  51. IMPORT struct Window*      MainWindowPtr;
  52. IMPORT struct VisualInfo*  VisualInfoPtr;
  53. IMPORT TEXT                aslresult[VLONGFIELD + 1];
  54.  
  55. MODULE struct
  56. {   TEXT output[VLONGFIELD + 1];
  57. } batt;
  58.  
  59. MODULE void updatebattgadgets(void);
  60. MODULE void drawbit(ULONG bit, UBYTE colour);
  61. MODULE void readbatt(ABOOL print);
  62.  
  63. AGLOBAL void batt_init(void)
  64. {   batt.output[0] = 0;
  65. }
  66.  
  67. AGLOBAL void batt1(void)
  68. {   ULONG hostid = 0;
  69.  
  70.     if (!BattMemBase)
  71.     {   if (!(BattMemBase = OpenResource(BATTMEMNAME)))
  72.         {   rq("Can't open battery RAM resource!");
  73.     }   }
  74.  
  75.     verynewwindow
  76.     (   BATT1WIDTH, BATT1HEIGHT,
  77.         "Report+: Battery-backed Memory",
  78.         BUTTONIDCMP
  79.     );
  80.     if (fillwindows)
  81.     {   SetAPen(MainWindowPtr->RPort, 0);
  82.         RectFill(MainWindowPtr->RPort, BOXLEFTX, BOXTOPY, BOXRIGHTX, BOXBOTTOMY);
  83.     }
  84.     OnMenu(MainWindowPtr, FULLMENUNUM(MN_PROJECT, IN_OPEN,   NOSUB));
  85.     OnMenu(MainWindowPtr, FULLMENUNUM(MN_PROJECT, IN_SAVE,   NOSUB));
  86.     OnMenu(MainWindowPtr, FULLMENUNUM(MN_PROJECT, IN_SAVEAS, NOSUB));
  87.  
  88.     setgadget(48, 54, 133, 12, "_Revert", NULL);
  89.     BU91_Revert = PrevGadPtr = (struct Gadget *) CreateGadget
  90.     (   BUTTON_KIND,
  91.         PrevGadPtr,
  92.         &Gadget,
  93.         GT_Underscore, '_',
  94.         TAG_DONE
  95.     );
  96.     setgadget(181, 54, 133, 12, "_Write", NULL);
  97.     BU91_Write = PrevGadPtr = (struct Gadget *) CreateGadget
  98.     (   BUTTON_KIND,
  99.         PrevGadPtr,
  100.         &Gadget,
  101.         GT_Underscore, '_',
  102.         TAG_DONE
  103.     );
  104.  
  105.     readbatt(FALSE);
  106.     setgadget(360, 24, 0, 0, "AMIGA_AMNESIA ($00)", PLACETEXT_RIGHT);
  107.     CB91_AmigaAmnesia = PrevGadPtr = (struct Gadget *) CreateGadget
  108.     (   CHECKBOX_KIND,
  109.         PrevGadPtr,
  110.         &Gadget,
  111.         GTCB_Checked,
  112.         (BattBuffer[BATTMEM_AMIGA_AMNESIA_ADDR] & 1)? 0 : 1,
  113.         TAG_DONE
  114.     );
  115.     setgadget(360, 38, 0, 0, "SHARED_AMNESIA ($40)", PLACETEXT_RIGHT);
  116.     CB91_SharedAmnesia = PrevGadPtr = (struct Gadget *) CreateGadget
  117.     (   CHECKBOX_KIND,
  118.         PrevGadPtr,
  119.         &Gadget,
  120.         GTCB_Checked,
  121.         (BattBuffer[BATTMEM_SHARED_AMNESIA_ADDR] & 1)? 0 : 1,
  122.         TAG_DONE
  123.     );
  124.     setgadget(360, 52, 0, 0, "SCSI_TIMEOUT ($01)", PLACETEXT_RIGHT);
  125.     CB91_SCSITimeout = PrevGadPtr = (struct Gadget *) CreateGadget
  126.     (   CHECKBOX_KIND,
  127.         PrevGadPtr,
  128.         &Gadget,
  129.         GTCB_Checked,
  130.         BattBuffer[BATTMEM_SCSI_TIMEOUT_ADDR],
  131.         TAG_DONE
  132.     );
  133.     setgadget(360, 66, 0, 0, "SCSI_LUNS ($02)", PLACETEXT_RIGHT);
  134.     CB91_SCSILUNS = PrevGadPtr = (struct Gadget *) CreateGadget
  135.     (   CHECKBOX_KIND,
  136.         PrevGadPtr,
  137.         &Gadget,
  138.         GTCB_Checked,
  139.         BattBuffer[BATTMEM_SCSI_LUNS_ADDR],
  140.         TAG_DONE
  141.     );
  142.     setgadget(334, 80, 52, 12, "SCSI_HOST_ID ($41-43)", PLACETEXT_RIGHT);
  143.     if (!BattBuffer[BATTMEM_SCSI_HOST_ID_ADDR])
  144.     {   hostid += 4;
  145.     }
  146.     if (!BattBuffer[BATTMEM_SCSI_HOST_ID_ADDR + 1])
  147.     {   hostid += 2;
  148.     }
  149.     if (!BattBuffer[BATTMEM_SCSI_HOST_ID_ADDR + 2])
  150.     {   hostid++;
  151.     }
  152.     IN91_SCSIHostID = PrevGadPtr = (struct Gadget *) CreateGadget
  153.     (   INTEGER_KIND,
  154.         PrevGadPtr,
  155.         &Gadget,
  156.         GTIN_Number, hostid,
  157.         GA_TabCycle, TRUE,
  158.         TAG_DONE
  159.     );
  160.     setgadget(360, 94, 0, 0, "SCSI_SYNC_XFER ($44)", PLACETEXT_RIGHT);
  161.     CB91_SCSISyncXfer = PrevGadPtr = (struct Gadget *) CreateGadget
  162.     (   CHECKBOX_KIND,
  163.         PrevGadPtr,
  164.         &Gadget,
  165.         GTCB_Checked,
  166.         BattBuffer[BATTMEM_SCSI_SYNC_XFER_ADDR],
  167.         TAG_DONE
  168.     );
  169.     setgadget(360, 108, 0, 0, "SCSI_FAST_SYNC ($45)", PLACETEXT_RIGHT);
  170.     CB91_SCSIFastSync = PrevGadPtr = (struct Gadget *) CreateGadget
  171.     (   CHECKBOX_KIND,
  172.         PrevGadPtr,
  173.         &Gadget,
  174.         GTCB_Checked,
  175.         (BattBuffer[BATTMEM_SCSI_FAST_SYNC_ADDR] & 1)? 0 : 1,
  176.         TAG_DONE
  177.     );
  178.     setgadget(360, 122, 0, 0, "SCSI_TAG_QUEUES ($46)", PLACETEXT_RIGHT);
  179.     CB91_SCSITagQueues = PrevGadPtr = (struct Gadget *) CreateGadget
  180.     (   CHECKBOX_KIND,
  181.         PrevGadPtr,
  182.         &Gadget,
  183.         GTCB_Checked,
  184.         BattBuffer[BATTMEM_SCSI_TAG_QUEUES_ADDR],
  185.         TAG_DONE
  186.     );
  187.  
  188.     drawgadgets((UWORD) ~0);
  189.  
  190.     DrawBevelBox(MainWindowPtr->RPort, BOXLEFTX, BOXTOPY, BOXRIGHTX - BOXLEFTX, BOXBOTTOMY - BOXTOPY, GT_VisualInfo, VisualInfoPtr, GTBB_Recessed, FALSE, TAG_DONE);
  191.     SetDrMd(MainWindowPtr->RPort, JAM1);
  192.     SetAPen(MainWindowPtr->RPort, BLACK);
  193.     Move(MainWindowPtr->RPort, 16, BOXTOPY + 10);
  194.     Text(MainWindowPtr->RPort, "$00:", 4);
  195.     Move(MainWindowPtr->RPort, 16, BOXTOPY + 18);
  196.     Text(MainWindowPtr->RPort, "$20:", 4);
  197.     Move(MainWindowPtr->RPort, 16, BOXTOPY + 26);
  198.     Text(MainWindowPtr->RPort, "$40:", 4);
  199.     SetDrMd(MainWindowPtr->RPort, JAM2);
  200.  
  201.     readbatt(TRUE);
  202.  
  203.     ActivateGadget(IN91_SCSIHostID, MainWindowPtr, NULL);
  204.     loop();
  205.     closewindow();
  206. }
  207.  
  208. MODULE void updatebattgadgets(void)
  209. {   ULONG hostid = 0;
  210.  
  211.     GT_SetGadgetAttrs(CB91_AmigaAmnesia, MainWindowPtr, NULL,
  212.                       GTCB_Checked,
  213.                       (BattBuffer[BATTMEM_AMIGA_AMNESIA_ADDR] & 1)? 0 : 1,
  214.                       TAG_DONE);
  215.     GT_SetGadgetAttrs(CB91_SharedAmnesia, MainWindowPtr, NULL,
  216.                       GTCB_Checked,
  217.                       (BattBuffer[BATTMEM_SHARED_AMNESIA_ADDR] & 1)? 0 : 1,
  218.                       TAG_DONE);
  219.     GT_SetGadgetAttrs(CB91_SCSITimeout, MainWindowPtr, NULL,
  220.                       GTCB_Checked,
  221.                       BattBuffer[BATTMEM_SCSI_TIMEOUT_ADDR],
  222.                       TAG_DONE);
  223.     GT_SetGadgetAttrs(CB91_SCSILUNS, MainWindowPtr, NULL,
  224.                       GTCB_Checked,
  225.                       BattBuffer[BATTMEM_SCSI_LUNS_ADDR],
  226.                       TAG_DONE);
  227.     if (!BattBuffer[BATTMEM_SCSI_HOST_ID_ADDR])
  228.     {   hostid += 4;
  229.     }
  230.     if (!BattBuffer[BATTMEM_SCSI_HOST_ID_ADDR + 1])
  231.     {   hostid += 2;
  232.     }
  233.     if (!BattBuffer[BATTMEM_SCSI_HOST_ID_ADDR + 2])
  234.     {   hostid++;
  235.     }
  236.     GT_SetGadgetAttrs(IN91_SCSIHostID, MainWindowPtr, NULL,
  237.                       GTIN_Number, hostid,
  238.                       TAG_DONE);
  239.     GT_SetGadgetAttrs(CB91_SCSISyncXfer, MainWindowPtr, NULL,
  240.                       GTCB_Checked,
  241.                       BattBuffer[BATTMEM_SCSI_SYNC_XFER_ADDR],
  242.                       TAG_DONE);
  243.     GT_SetGadgetAttrs(CB91_SCSIFastSync, MainWindowPtr, NULL,
  244.                       GTCB_Checked,
  245.                       (BattBuffer[BATTMEM_SCSI_FAST_SYNC_ADDR] & 1)? 0 : 1,
  246.                       TAG_DONE);
  247.     GT_SetGadgetAttrs(CB91_SCSITagQueues, MainWindowPtr, NULL,
  248.                       GTCB_Checked,
  249.                       BattBuffer[BATTMEM_SCSI_TAG_QUEUES_ADDR],
  250.                       TAG_DONE);
  251. }
  252.  
  253. MODULE void drawbit(ULONG bit, UBYTE colour)
  254. {   Move(MainWindowPtr->RPort, BOXLEFTX + 4 + (8 * (bit % 32)), BOXTOPY + 10 + (8 * (bit / 32)));
  255.  
  256.     if
  257.     (   (bit >= 0x0  && bit <= 0x2)
  258.      || (bit >= 0x40 && bit <= 0x46)
  259.     )
  260.     {   if (colour == BLACK)
  261.         {   colour = GREY;
  262.         }
  263.         SetAPen(MainWindowPtr->RPort, colour);
  264.         SetBPen(MainWindowPtr->RPort, BLACK);
  265.     } else
  266.     {   SetAPen(MainWindowPtr->RPort, colour);
  267.         SetBPen(MainWindowPtr->RPort, GREY);
  268.     }
  269.  
  270.     if (BattBuffer[bit] & 1)
  271.         Text(MainWindowPtr->RPort, "1", 1);
  272.     else
  273.         Text(MainWindowPtr->RPort, "0", 1);
  274.     return;
  275. }
  276.  
  277. MODULE void readbatt(ABOOL print)
  278. {   ULONG i;
  279.  
  280.     ObtainBattSemaphore();
  281.     for (i = 0; i <= 95; i++)
  282.     {   if (ReadBattMem(&BattBuffer[i], i, 1))
  283.         {   ReleaseBattSemaphore();
  284.             rq("Can't read battery-backed memory!");
  285.     }   }
  286.     if (print)
  287.         for (i = 0; i <= 95; i++)
  288.             drawbit(i, BLACK);
  289.     ReleaseBattSemaphore();
  290. }
  291.  
  292. AGLOBAL void batt_loop(ULONG class, struct Gadget* addr, UWORD code, UWORD qual, SWORD mousex, SWORD mousey)
  293. {   UWORD realx, realy, bit;
  294.     ULONG hostid;
  295.  
  296.     if (class == IDCMP_MOUSEBUTTONS)
  297.     {   if (code == SELECTDOWN && !(qual & IEQUALIFIER_REPEAT))
  298.         {   if (mousex >= BOXLEFTX && mousex <= BOXRIGHTX && mousey >= BOXTOPY && mousey <= BOXBOTTOMY)
  299.             {   realx = (mousex - BOXLEFTX - 2) / 8;
  300.                 realy = (mousey - BOXTOPY - 4) / 8;
  301.                 if (realx < 0)
  302.                     realx = 0;
  303.                 elif (realx > 31)
  304.                     realx = 31;
  305.                 if (realy < 0)
  306.                     realy = 0;
  307.                 elif (realy > 2)
  308.                     realy = 2;
  309.                 bit = (realy * 32) + realx;
  310.                 BattBuffer[bit] ^= 1;
  311.                 drawbit(bit, WHITE);
  312.                 updatebattgadgets();
  313.     }   }   }
  314.     elif (class == IDCMP_VANILLAKEY)
  315.     {   code = toupper(code);
  316.         if (code == 'R')
  317.         {   readbatt(TRUE);
  318.             updatebattgadgets();
  319.         } elif (code == 'W')
  320.         {   writebatt(TRUE);
  321.         } elif (code == ESCAPE)
  322.         {   page = 0;
  323.     }   }
  324.     elif (class == IDCMP_GADGETUP)
  325.     {   if (addr == BU99_Right)
  326.             page = 0;
  327.         elif (addr == CB91_AmigaAmnesia)
  328.         {   if (CB91_AmigaAmnesia->Flags & GFLG_SELECTED)
  329.                 BattBuffer[BATTMEM_AMIGA_AMNESIA_ADDR] = 0;
  330.             else BattBuffer[BATTMEM_AMIGA_AMNESIA_ADDR] = 1;
  331.             drawbit(BATTMEM_AMIGA_AMNESIA_ADDR, WHITE);
  332.         } elif (addr == CB91_SharedAmnesia)
  333.         {   if (CB91_SharedAmnesia->Flags & GFLG_SELECTED)
  334.                 BattBuffer[BATTMEM_SHARED_AMNESIA_ADDR] = 0;
  335.             else BattBuffer[BATTMEM_SHARED_AMNESIA_ADDR] = 1;
  336.             drawbit(BATTMEM_SHARED_AMNESIA_ADDR, WHITE);
  337.         } elif (addr == CB91_SCSITimeout)
  338.         {   if (CB91_SCSITimeout->Flags & GFLG_SELECTED)
  339.                 BattBuffer[BATTMEM_SCSI_TIMEOUT_ADDR] = 1;
  340.             else BattBuffer[BATTMEM_SCSI_TIMEOUT_ADDR] = 0;
  341.             drawbit(BATTMEM_SCSI_TIMEOUT_ADDR, WHITE);
  342.         } elif (addr == CB91_SCSILUNS)
  343.         {   if (CB91_SCSILUNS->Flags & GFLG_SELECTED)
  344.                 BattBuffer[BATTMEM_SCSI_LUNS_ADDR] = 1;
  345.             else BattBuffer[BATTMEM_SCSI_LUNS_ADDR] = 0;
  346.             drawbit(BATTMEM_SCSI_LUNS_ADDR, WHITE);
  347.         } elif (addr == IN91_SCSIHostID)
  348.         {   hostid = ((struct StringInfo *) IN91_SCSIHostID->SpecialInfo)->LongInt;
  349.             if (hostid < 0 || hostid > 7)
  350.             {   hostid = 7;
  351.             }
  352.             GT_SetGadgetAttrs
  353.             (   IN91_SCSIHostID,
  354.                 MainWindowPtr, NULL,
  355.                 GTIN_Number, hostid,
  356.                 TAG_DONE
  357.             );
  358.             BattBuffer[BATTMEM_SCSI_HOST_ID_ADDR]     = (hostid & 4)? 0 : 1;
  359.             BattBuffer[BATTMEM_SCSI_HOST_ID_ADDR + 1] = (hostid & 2)? 0 : 1;
  360.             BattBuffer[BATTMEM_SCSI_HOST_ID_ADDR + 2] = (hostid & 1)? 0 : 1;
  361.             drawbit(BATTMEM_SCSI_HOST_ID_ADDR    , WHITE);
  362.             drawbit(BATTMEM_SCSI_HOST_ID_ADDR + 1, WHITE);
  363.             drawbit(BATTMEM_SCSI_HOST_ID_ADDR + 2, WHITE);
  364.         } elif (addr == CB91_SCSISyncXfer)
  365.         {   if (CB91_SCSISyncXfer->Flags & GFLG_SELECTED)
  366.                 BattBuffer[BATTMEM_SCSI_SYNC_XFER_ADDR] = 1;
  367.             else BattBuffer[BATTMEM_SCSI_SYNC_XFER_ADDR] = 0;
  368.             drawbit(BATTMEM_SCSI_SYNC_XFER_ADDR, WHITE);
  369.         } elif (addr == CB91_SCSIFastSync)
  370.         {   if (CB91_SCSIFastSync->Flags & GFLG_SELECTED)
  371.                 BattBuffer[BATTMEM_SCSI_FAST_SYNC_ADDR] = 0;
  372.             else BattBuffer[BATTMEM_SCSI_FAST_SYNC_ADDR] = 1;
  373.             drawbit(BATTMEM_SCSI_FAST_SYNC_ADDR, WHITE);
  374.         } elif (addr == CB91_SCSITagQueues)
  375.         {   if (CB91_SCSITagQueues->Flags & GFLG_SELECTED)
  376.                 BattBuffer[BATTMEM_SCSI_TAG_QUEUES_ADDR] = 1;
  377.             else BattBuffer[BATTMEM_SCSI_TAG_QUEUES_ADDR] = 0;
  378.             drawbit(BATTMEM_SCSI_TAG_QUEUES_ADDR, WHITE);
  379.         } elif (addr == BU91_Revert)
  380.         {   readbatt(TRUE);
  381.             updatebattgadgets();
  382.         } elif (addr == BU91_Write)
  383.         {   writebatt(TRUE);
  384. }   }   }
  385.  
  386. AGLOBAL void writebatt(ABOOL verify)
  387. {   ULONG i;
  388.  
  389.     ObtainBattSemaphore();
  390.     for (i = 0; i <= 95; i++)
  391.     {   if (WriteBattMem(&BattBuffer[i], i, 1))
  392.         {   ReleaseBattSemaphore();
  393.             rq("Can't write battery-backed memory!");
  394.     }   }
  395.     ReleaseBattSemaphore();
  396.     if (verify)
  397.     {   readbatt(TRUE);
  398. }   }
  399.  
  400. AGLOBAL void batt_open(void)
  401. {   BPTR  FileHandle;
  402.     ULONG i;
  403.  
  404.     if (asl("~(#?.info)"))
  405.     {   if (!(FileHandle = (BPTR) Open(aslresult, MODE_OLDFILE)))
  406.         {   DisplayBeep(NULL);
  407.             return;
  408.         }
  409.         /* The format of "battery RAM" files (suggested extension
  410.           ".battery") is simply a raw dump of the 12 bytes. */
  411.  
  412.         if (Read(FileHandle, IOBuffer, 12) == -1)
  413.         {   DisplayBeep(NULL);
  414.         } else
  415.         {   for (i = 0; i <= 95; i++)
  416.             {   if (IOBuffer[i / 8] & (1 << (i % 8)))
  417.                 {   BattBuffer[i] = TRUE;
  418.                 } else BattBuffer[i] = FALSE;
  419.                 drawbit(i, WHITE);
  420.         }   }
  421.         Close(FileHandle);
  422.     }
  423.     updatebattgadgets();
  424. }
  425.  
  426. AGLOBAL void batt_save(ABOOL saveas)
  427. {   BPTR  FileHandle;
  428.     ULONG i;
  429.  
  430.     if (!batt.output[0] || saveas) // if we need a filename
  431.     {   if (saveasl("Save Battery RAM", "~(#?.info)"))
  432.         {   strcpy(batt.output, aslresult);
  433.         } else return;
  434.     }
  435.  
  436.     if (!(FileHandle = (BPTR) Open(aslresult, MODE_NEWFILE)))
  437.     {   DisplayBeep(NULL);
  438.         return;
  439.     }
  440.     for (i = 0; i <= 11; i++)
  441.     {   IOBuffer[i] = 0;
  442.     }
  443.     for (i = 0; i <= 95; i++)
  444.     {   if (BattBuffer[i])
  445.         {   IOBuffer[i / 8] |= BattBuffer[i] << (i % 8);
  446.     }   }
  447.     if (Write(FileHandle, IOBuffer, 12) == -1)
  448.     {   DisplayBeep(NULL);
  449.     }
  450.     Close(FileHandle);
  451. }
  452.